package cn.engage.filter;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Component // 和RequestTimeFilter，RequestTimeFilterConfig一起使用
public class LoginFilter implements GlobalFilter, Ordered {

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    String path = exchange.getRequest().getURI().getPath();
    log.info("login check, uri path：{}", path);
    // 1.包含公共资源，直接放行
    if (!path.endsWith("login") && !path.endsWith("register")){
      List<String> token = exchange.getRequest().getHeaders().get("token");
      // 1.如果等于空意味着没有登陆，那么直接响应浏览器
      if (token == null || token.size() == 0){
        // 1.响应对象
        ServerHttpResponse response = exchange.getResponse();
        // 2.构建错误结果
        HashMap<String,Object> data = new HashMap<>();
        // 3.设置响应信息
        data.put("code", 401);
        data.put("success", false);
        data.put("message","登录校验失败，请重新登录！");
        DataBuffer buffer = null;
        try {
          //  4.转换参数，包装buffer对象
          // 4.1.将数据转换为JSON，再转换为byte数组
          byte[] bytes = JSON.toJSONString(data).getBytes("utf-8");
          // 4.2.将byte数组包装到DataBuffer对象中，用于响应给浏览器，构建响应内容
          buffer = response.bufferFactory().wrap(bytes);

          // 5.设置完成响应，不会继续执行后面的filter
          // 5.1.设置响应状态为401
          response.setStatusCode(HttpStatus.UNAUTHORIZED);
          // 5.2.设置响应格式
          response.getHeaders().add("Content-Type","application/json;charset=UTF-8");
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }
        // 把结果写给客户端
        return response.writeWith(Mono.just(buffer));
      }
    }
    return chain.filter(exchange);
  }

  @Override
  public int getOrder() {
    return 0;
  }

}
